home *** CD-ROM | disk | FTP | other *** search
-
- **************************************
- * I want a routine to calculate all the
- * info needed for the sound player to
- * work, given say position of noise, volume
- * and sample number.
-
-
- move.w #100,Noisevol
- move.w #1,Samplenum
- move.w #100,Noisex
- move.w #0,Noisez
- move.b #1,IDNUM
- bsr MakeSomeNoise
-
- move.w #100,Noisevol
- move.w #1,Samplenum
- move.w #100,Noisex
- move.w #0,Noisez
- move.b #2,IDNUM
- bsr MakeSomeNoise
-
- move.w #100,Noisevol
- move.w #1,Samplenum
- move.w #100,Noisex
- move.w #0,Noisez
- move.b #3,IDNUM
- bsr MakeSomeNoise
-
- move.w #100,Noisevol
- move.w #1,Samplenum
- move.w #0,Noisex
- move.w #0,Noisez
- move.b #4,IDNUM
- bsr MakeSomeNoise
-
- testit:
- move.w #200,Noisevol
- move.w #1,Samplenum
- move.w #100,Noisex
- move.w #0,Noisez
- move.b #2,IDNUM
- bsr MakeSomeNoise
-
-
- rts
-
-
- MakeSomeNoise:
-
- ; Plan for new sound handler:
- ; It is sent a sample number,
- ; a position relative to the
- ; player, an id number and a volume.
- ; Also notifplaying.
-
- ; indirect inputs are the available
- ; channel flags and whether or not
- ; stereo sound is selected.
-
- ; the algorithm must decide
- ; whether the new sound is more
- ; important than the ones already
- ; playing. Thus an 'importance'
- ; must be calculated, probably
- ; using volume.
-
- ; The output needs to be:
-
- ; Write the pointers and volumes of
- ; the sound channels
-
-
- tst.b notifplaying
- beq.s dontworry
-
- ; find if we are already playing
-
- move.b IDNUM,d0
- move.w #7,d1
- lea CHANNELDATA,a3
- findsameasme
- tst.b (a3)
- bne.s notavail
- cmp.b 1(a3),d0
- beq SameAsMe
- notavail:
- add.w #4,a3
- dbra d1,findsameasme
- bra dontworry
- SameAsMe
- rts
-
- noiseloud: dc.w 0
-
- dontworry:
-
- ; Ok its fine for us to play a sound.
- ; So calculate left/right volume.
-
- move.w Noisex,d1
- muls d1,d1
- move.w Noisez,d2
- muls d2,d2
- move.w #64,d3
- move.w #32767,noiseloud
- moveq #1,d0
- add.l d1,d2
- beq pastcalc
-
- move.w #31,d0
- .findhigh
- btst d0,d2
- bne .foundhigh
- dbra d0,.findhigh
- .foundhigh
- asr.w #1,d0
- clr.l d3
- bset d0,d3
- move.l d3,d0
-
- move.w d0,d3
- muls d3,d3 ; x*x
- sub.l d2,d3 ; x*x-a
- asr.l #1,d3 ; (x*x-a)/2
- divs d0,d3 ; (x*x-a)/2x
- sub.w d3,d0 ; second approx
- bgt .stillnot0
- move.w #1,d0
- .stillnot0
-
- move.w d0,d3
- muls d3,d3
- sub.l d2,d3
- asr.l #1,d3
- divs d0,d3
- sub.w d3,d0 ; second approx
- bgt .stillnot02
- move.w #1,d0
- .stillnot02
-
- move.w Noisevol,d3
- ext.l d3
- asl.l #6,d3
- cmp.l #32767,d3
- ble.s .nnnn
- move.l #32767,d3
- .nnnn
-
- asr.w #2,d0
- addq #1,d0
- divs d0,d3
-
- move.w d3,noiseloud
-
- cmp.w #64,d3
- ble.s notooloud
- move.w #64,d3
- notooloud:
-
- pastcalc:
-
- ; d3 contains volume of noise.
-
- move.w d3,d4
- tst.b STEREO
- beq NOSTEREO
-
- move.w d3,d2
- muls Noisex,d2
- asl.w #2,d0
- divs d0,d2
-
- bgt.s quietleft
- add.w d2,d4
- bge.s donequiet
- move.w #0,d4
- bra.s donequiet
- quietleft:
- sub.w d2,d3
- bge.s donequiet
- move.w #0,d3
- donequiet:
-
- ; d3=leftvol?
- ; d4=rightvol?
-
- clr.w needleft
-
- cmp.b d3,d4
- bgt.s RightLouder
-
- ; Left is louder; is it MUCH louder?
-
- st needleft
- move.w d3,d2
- sub.w d4,d2
- cmp.w #32,d2
- slt needright
- bra aboutsame
-
- RightLouder:
- st needright
- move.w d4,d2
- sub.w d3,d2
- cmp.w #32,d2
- slt needleft
-
- aboutsame:
-
-
- ; Find least important sound on left
-
- move.l #0,a2
- move.l #0,d5
- move.w #32767,d2
- move.b IDNUM,d0
- lea LEFTCHANDATA,a3
- move.w #3,d1
- FindLeftChannel
- tst.b (a3)
- bne.s .notactive
- cmp.b 1(a3),d0
- beq.s FOUNDLEFT
- cmp.w 2(a3),d2
- blt.s .notactive
- move.w 2(a3),d2
- move.l a3,a2
- move.w d5,d6
-
- .notactive:
- add.w #4,a3
- add.w #1,d5
- dbra d1,FindLeftChannel
- move.l a2,a3
- bra.s gopastleft
- FOUNDLEFT:
- move.w d5,d6
- gopastleft:
- tst.l a3
- bne.s FOUNDALEFT
- NONOISE:
- rts
- FOUNDALEFT:
-
- cmp.w noiseloud,d3
- bge.s NONOISE
-
- ; d6 = channel number
- move.b d0,1(a3)
- move.w d3,2(a3)
-
- move.w Samplenum,d5
- move.l #SampleList,a3
- move.l (a3,d5.w*8),a1
- move.l 4(a3,d5.w*8),a2
-
- tst.b d6
- seq NoiseMade0LEFT
- beq.s .chan0
- cmp.b #2,d6
- slt NoiseMade1LEFT
- blt .chan1
- seq NoiseMade2LEFT
- beq .chan2
- st NoiseMade3LEFT
-
- move.b d5,LEFTPLAYEDTAB+9
- move.b d3,LEFTPLAYEDTAB+1+9
- move.b d4,LEFTPLAYEDTAB+2+9
- move.b d3,vol3left
- move.l a1,pos3LEFT
- move.l a2,Samp3endLEFT
- bra dorightchan
-
- .chan0:
- move.b d5,LEFTPLAYEDTAB
- move.b d3,LEFTPLAYEDTAB+1
- move.b d4,LEFTPLAYEDTAB+2
- move.l a1,pos0LEFT
- move.l a2,Samp0endLEFT
- move.b d3,vol0left
- bra dorightchan
-
- .chan1:
- move.b d5,LEFTPLAYEDTAB+3
- move.b d3,LEFTPLAYEDTAB+1+3
- move.b d4,LEFTPLAYEDTAB+2+3
- move.b d3,vol1left
- move.l a1,pos1LEFT
- move.l a2,Samp1endLEFT
- bra dorightchan
-
- .chan2:
- move.b d5,LEFTPLAYEDTAB+6
- move.b d3,LEFTPLAYEDTAB+1+6
- move.b d4,LEFTPLAYEDTAB+2+6
- move.l a1,pos2LEFT
- move.l a2,Samp2endLEFT
- move.b d3,vol2left
-
- dorightchan:
-
- ; Find least important sound on right
-
- move.l #0,a2
- move.l #0,d5
- move.w #10000,d2
- move.b IDNUM,d0
- lea RIGHTCHANDATA,a3
- move.w #3,d1
- FindRightChannel
- tst.b (a3)
- bne.s .notactive
- cmp.b 1(a3),d0
- beq.s FOUNDRIGHT
- cmp.w 2(a3),d2
- blt.s .notactive
- move.w 2(a3),d2
- move.l a3,a2
- move.w d5,d6
-
- .notactive:
- add.w #4,a3
- add.w #1,d5
- dbra d1,FindRightChannel
- move.l a2,a3
- bra.s gopastright
- FOUNDRIGHT:
- move.w d5,d6
- gopastright:
- tst.l a3
- bne.s FOUNDARIGHT
- rts
- FOUNDARIGHT:
-
- ; d6 = channel number
- move.b d0,1(a3)
- move.w d3,2(a3)
-
- move.w Samplenum,d5
- move.l #SampleList,a3
- move.l (a3,d5.w*8),a1
- move.l 4(a3,d5.w*8),a2
-
- tst.b d6
- seq NoiseMade0RIGHT
- beq.s .chan0
- cmp.b #2,d6
- slt NoiseMade1RIGHT
- blt .chan1
- seq NoiseMade2RIGHT
- beq .chan2
- st NoiseMade3RIGHT
-
- move.b d5,RIGHTPLAYEDTAB+9
- move.b d3,RIGHTPLAYEDTAB+1+9
- move.b d4,RIGHTPLAYEDTAB+2+9
- move.b d4,vol3right
- move.l a1,pos3RIGHT
- move.l a2,Samp3endRIGHT
- rts
-
- .chan0:
- move.b d5,RIGHTPLAYEDTAB
- move.b d3,RIGHTPLAYEDTAB+1
- move.b d4,RIGHTPLAYEDTAB+2
- move.l a1,pos0RIGHT
- move.l a2,Samp0endRIGHT
- move.b d4,vol0right
- rts
-
- .chan1:
- move.b d5,RIGHTPLAYEDTAB+3
- move.b d3,RIGHTPLAYEDTAB+1+3
- move.b d4,RIGHTPLAYEDTAB+2+3
- move.b d3,vol1right
- move.l a1,pos1RIGHT
- move.l a2,Samp1endRIGHT
- rts
-
- .chan2:
- move.b d5,RIGHTPLAYEDTAB+6
- move.b d3,RIGHTPLAYEDTAB+1+6
- move.b d4,RIGHTPLAYEDTAB+2+6
- move.l a1,pos2RIGHT
- move.l a2,Samp2endRIGHT
- move.b d3,vol2right
- rts
-
- NOSTEREO:
- move.l #0,a2
- move.l #-1,d5
- move.w #32767,d2
- move.b IDNUM,d0
- lea CHANNELDATA,a3
- move.w #7,d1
- FindChannel
- tst.b (a3)
- bne.s .notactive
- cmp.b 1(a3),d0
- beq.s FOUNDCHAN
- cmp.w 2(a3),d2
- blt.s .notactive
- move.w 2(a3),d2
- move.l a3,a2
- move.w d5,d6
- add.w #1,d6
-
- .notactive:
- add.w #4,a3
- add.w #1,d5
- dbra d1,FindChannel
-
- move.l a2,a3
- bra.s gopastchan
- FOUNDCHAN:
- move.w d5,d6
- add.w #1,d6
- gopastchan:
- tst.w d6
- bge.s FOUNDACHAN
- tooquiet:
- rts
- FOUNDMYCHAN:
- move.w 2(a3),d2
-
- FOUNDACHAN:
-
- ; d6 = channel number
-
- cmp.w noiseloud,d2
- bgt.s tooquiet
-
- move.b d0,1(a3)
- move.w noiseloud,2(a3)
-
- move.w Samplenum,d5
- move.l #SampleList,a3
- move.l (a3,d5.w*8),a1
- move.l 4(a3,d5.w*8),a2
-
- tst.b d6
- beq .chan0
- cmp.b #2,d6
- blt .chan1
- beq .chan2
- cmp.b #4,d6
- blt .chan3
- beq .chan4
- cmp.b #6,d6
- blt .chan5
- beq .chan6
- st NoiseMade3RIGHT
-
- move.b d5,RIGHTPLAYEDTAB+9
- move.b d3,RIGHTPLAYEDTAB+1+9
- move.b d4,RIGHTPLAYEDTAB+2+9
- move.b d4,vol3right
- move.l a1,pos3RIGHT
- move.l a2,Samp3endRIGHT
- rts
-
- .chan3:
- st NoiseMade3LEFT
- move.b d5,LEFTPLAYEDTAB+9
- move.b d3,LEFTPLAYEDTAB+1+9
- move.b d4,LEFTPLAYEDTAB+2+9
- move.b d3,vol3left
- move.l a1,pos3LEFT
- move.l a2,Samp3endLEFT
- bra dorightchan
-
- .chan0:
- st NoiseMade0LEFT
- move.b d5,LEFTPLAYEDTAB
- move.b d3,LEFTPLAYEDTAB+1
- move.b d4,LEFTPLAYEDTAB+2
- move.l a1,pos0LEFT
- move.l a2,Samp0endLEFT
- move.b d3,vol0left
- rts
-
- .chan1:
- st NoiseMade1LEFT
- move.b d5,LEFTPLAYEDTAB+3
- move.b d3,LEFTPLAYEDTAB+1+3
- move.b d4,LEFTPLAYEDTAB+2+3
- move.b d3,vol1left
- move.l a1,pos1LEFT
- move.l a2,Samp1endLEFT
- rts
-
- .chan2:
- st NoiseMade2LEFT
- move.b d5,LEFTPLAYEDTAB+6
- move.b d3,LEFTPLAYEDTAB+1+6
- move.b d4,LEFTPLAYEDTAB+2+6
- move.l a1,pos2LEFT
- move.l a2,Samp2endLEFT
- move.b d3,vol2left
- rts
-
- .chan4:
- st NoiseMade0RIGHT
- move.b d5,RIGHTPLAYEDTAB
- move.b d3,RIGHTPLAYEDTAB+1
- move.b d4,RIGHTPLAYEDTAB+2
- move.l a1,pos0RIGHT
- move.l a2,Samp0endRIGHT
- move.b d4,vol0right
- rts
-
- .chan5:
- st NoiseMade1RIGHT
- move.b d5,RIGHTPLAYEDTAB+3
- move.b d3,RIGHTPLAYEDTAB+1+3
- move.b d4,RIGHTPLAYEDTAB+2+3
- move.b d3,vol1right
- move.l a1,pos1RIGHT
- move.l a2,Samp1endRIGHT
- rts
-
- .chan6:
- st NoiseMade2RIGHT
- move.b d5,RIGHTPLAYEDTAB+6
- move.b d3,RIGHTPLAYEDTAB+1+6
- move.b d4,RIGHTPLAYEDTAB+2+6
- move.l a1,pos2RIGHT
- move.l a2,Samp2endRIGHT
- move.b d3,vol2right
- rts
-
-
- audpos1: dc.w 0
- audpos1b: dc.w 0
- audpos2: dc.w 0
- audpos2b: dc.w 0
- audpos3: dc.w 0
- audpos3b: dc.w 0
- audpos4: dc.w 0
- audpos4b: dc.w 0
-
- vol0left: dc.w 0
- vol0right: dc.w 0
- vol1left: dc.w 0
- vol1right: dc.w 0
- vol2left: dc.w 0
- vol2right: dc.w 0
- vol3left: dc.w 0
- vol3right: dc.w 0
-
- pos: dc.l 0
-
- pos0LEFT: dc.l empty
- pos1LEFT: dc.l empty
- pos2LEFT: dc.l empty
- pos3LEFT: dc.l empty
- pos0RIGHT: dc.l empty
- pos1RIGHT: dc.l empty
- pos2RIGHT: dc.l empty
- pos3RIGHT: dc.l empty
-
-
- empty: ds.l 100
- emptyend:
-
-
- playnull0: dc.w 0
- playnull1: dc.w 0
- playnull2: dc.w 0
- playnull3: dc.w 0
-
- Samp0endRIGHT: dc.l emptyend
- Samp1endRIGHT: dc.l emptyend
- Samp2endRIGHT: dc.l emptyend
- Samp3endRIGHT: dc.l emptyend
- Samp0endLEFT: dc.l emptyend
- Samp1endLEFT: dc.l emptyend
- Samp2endLEFT: dc.l emptyend
- Samp3endLEFT: dc.l emptyend
-
- null: ds.b 500
- null2: ds.b 500
- null3: ds.b 500
- null4: ds.b 500
-
- Aupt0: dc.l null
- Auback0: dc.l null+500
- Aupt2: dc.l null3
- Auback2: dc.l null3+500
- Aupt3: dc.l null4
- Auback3: dc.l null4+500
- Aupt1: dc.l null2
- Auback1: dc.l null2+500
-
- NoiseMade0LEFT: dc.b 0
- NoiseMade1LEFT: dc.b 0
- NoiseMade2LEFT: dc.b 0
- NoiseMade3LEFT: dc.b 0
- NoiseMade0pLEFT: dc.b 0
- NoiseMade1pLEFT: dc.b 0
- NoiseMade2pLEFT: dc.b 0
- NoiseMade3pLEFT: dc.b 0
- NoiseMade0RIGHT: dc.b 0
- NoiseMade1RIGHT: dc.b 0
- NoiseMade2RIGHT: dc.b 0
- NoiseMade3RIGHT: dc.b 0
- NoiseMade0pRIGHT: dc.b 0
- NoiseMade1pRIGHT: dc.b 0
- NoiseMade2pRIGHT: dc.b 0
- NoiseMade3pRIGHT: dc.b 0
-
- SampleList:
- dc.l 0,0
- dc.l 0,0
- dc.l 0,0
- dc.l 0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- dc.l 0
- Samplenum: dc.w 0
- Noisex: dc.w 0
- Noisez: dc.w 0
- Noisevol: dc.w 0
- chanpick: dc.w 0
- IDNUM: dc.w 0
- needleft: dc.b 0
- needright: dc.b 0
- notifplaying: dc.w 0
- STEREO: dc.b $0
- even
- prot6: dc.w 0
-
- even
-
- CHANNELDATA:
- LEFTCHANDATA:
- dc.l $00000000
- dc.l $00000000
- dc.l $FF000000
- dc.l $FF000000
- RIGHTCHANDATA:
- dc.l $00000000
- dc.l $00000000
- dc.l $FF000000
- dc.l $FF000000
-
- RIGHTPLAYEDTAB: ds.l 20
- LEFTPLAYEDTAB: ds.l 20
- achan